CRC循环冗余校验码原理解析(附实例)

1.CRC简介

CRC循环冗余校验码是数据通信中的一种查错校验码。


2.CRC原理

CRC 算法的基本思想是将传输的数据[M(X)] 当做一个位数很长的数。将这个数除以另一个数[G(X)] ,得到的余数[R(X)] 作为校验数据附加到原数据后面,组成循环校验码。

M(X)代表待编码的有效信息
G(X)代表约定好的多项式
R(X)代表代表检验位

由于,CRC的结构 = 信息位(N位) + 校验位(K位)

所以,CRC编码 = M(X) + R(X)


3.CRC编码方法
  • 把待编码的N位有效信息位表示为多项式M(X)

  • 把M(X)左移K位,得到M(X)*X^K,这样就空出了K位,以便拼接K位余数,这里的K位是由多项式G(X)的最高位决定的

  • 选取一个生成多项式G(x),对M(X)*X^K模二除 (多项式G(X)一般会直接给你,模二除看下面例子,实质是异或运算),以下是运算公式

    ( M(X) * X^K ) / G(X) = Q(X) + R(X) / G(X)

    这里的Q(X)是商,它本身不重要,这里最重要的是求出余数R(X)

  • 将信息位M(X)与余数R(X)拼接起来,构成CRC循环冗余校验码

    CRC编码 = M(X) + R(X)


4.举个栗子

题目:选择产生多项式位1011,把4位有效信息1100编成CRC码

  • M(X) = X^3 + X^2 = 1100

  • M(X) * X^3 = X^6 + X^5 = 1100000 (这里多项式最高位位3,左移3位

  • G(X) = X^3 +X +1 = 1011

  • ( M(X) * X^K ) / G(X) = 1100000 / 1011 = 1110 + 010 / 1011 (关键,这里进行模二运算,实质上是异或运算,求R(X))
    在这里插入图片描述 经运算,此时确定R(X)为 010

  • 此时得出CRC编码 = M(X) + R(X) = 1100010


5.CRC编码的校验

校验原理:将得到的CRC码用约定的G(X)去除,余数为0,结果正确 ,某一位出错,则余数不为0

纠错的话,与G(X)的选择有关系,这方面比较深,考研大纲不考察纠错这块的知识点

  • 15
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CRC循环冗余校验码是一种数据校验算法,常用于检测和纠正数据传输过程中的错误。在Verilog中实现CRC循环冗余校验码需要进行以下步骤: 1. 首先,确定CRC校验码的生成多项式和初始值。生成多项式是一个固定长度的二进制数,用于生成校验码。初始值是一个与生成多项式长度相等的二进制数,用于初始化寄存器。 2. 创建一个模块,定义输入和输出信号。输入信号包括数据和校验值,输出信号为校验结果和有效信号。 3. 在模块中,定义时钟信号、复位信号和请求信号。时钟信号用于同步模块中的操作,复位信号用于初始化寄存器,请求信号用于触发校验操作。 4. 定义输入数据和校验值的宽度,并初始化它们的值。 5. 实例CRC模块,并将时钟、复位、请求信号以及输入数据和校验值连接到该模块的对应端口。 6. 根据模块中定义的操作逻辑,在模块中实现CRC校验的计算过程。 7. 仿真验证:使用仿真平台进行测试和验证。在仿真平台中,使用时钟信号、复位信号和请求信号来模拟时钟、复位和请求操作,并观察输出结果是否符合预期。 以上是在Verilog中实现CRC循环冗余校验码的一般步骤和方法。具体的实现细节和代码可以参考引用中提供的Verilog实现例子。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CRC_8循环冗余校验码verilog实现](https://blog.csdn.net/watyuanyuan/article/details/116465590)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [CRC循环冗余校验码的Verilog实现](https://blog.csdn.net/qq_40268672/article/details/122109145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值